package com.petdog.common.util;

import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

/**
 * 图像预处理工具类
 * 用于对图像进行预处理，以便输入到AI模型
 */
public class ImagePreprocessor {
    
    /**
     * 预处理图像文件
     * @param imageFile 图像文件
     * @param width 目标宽度
     * @param height 目标高度
     * @return 预处理后的图像数据（float数组形式）
     * @throws IOException 处理异常
     */
    public static float[] preprocess(MultipartFile imageFile, int width, int height) throws IOException {
        // 读取图像文件
        BufferedImage originalImage = ImageIO.read(imageFile.getInputStream());
        
        // 调整图像大小
        BufferedImage resizedImage = resizeImage(originalImage, width, height);
        
        // 转换为RGB格式
        BufferedImage rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = rgbImage.createGraphics();
        g.drawImage(resizedImage, 0, 0, null);
        g.dispose();
        
        // 创建输出数组（格式：[R, G, B, R, G, B, ...]）
        float[] data = new float[width * height * 3];
        int index = 0;
        
        // 遍历图像像素并转换为float数组
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int rgb = rgbImage.getRGB(x, y);
                
                // 提取RGB通道值
                int red = (rgb >> 16) & 0xFF;
                int green = (rgb >> 8) & 0xFF;
                int blue = rgb & 0xFF;
                
                // 归一化到[0, 1]并存储
                data[index++] = red / 255.0f;
                data[index++] = green / 255.0f;
                data[index++] = blue / 255.0f;
            }
        }
        
        return data;
    }
    
    /**
     * 调整图像大小
     * @param originalImage 原始图像
     * @param width 目标宽度
     * @param height 目标高度
     * @return 调整大小后的图像
     */
    private static BufferedImage resizeImage(BufferedImage originalImage, int width, int height) {
        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = resizedImage.createGraphics();
        
        // 使用高质量的缩放
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        g.drawImage(originalImage, 0, 0, width, height, null);
        g.dispose();
        
        return resizedImage;
    }
}